#include #include #include #include #define MAX_STR 11 /* MAX_STR - 1 caracteres iprimibles */ typedef struct { int numCod; char str[11]; double tMax; } TCodific; char vocal[] = "aeiou"; /********************************* prototipo de funciones **********************************/ int esVocal(char); char generarConsonante(); void generarStr(TCodific *); void generarCodific(TCodific *); int fcomp(const void *, const void *); /****************************** programa principal *******************************/ int main(int argc, char **argv) { long numDatos = atol(argv[1]); printf("\n Programa de ordenamiento usando QSORT\n"); printf(" -------------------------------------\n"); if(numDatos < 0) { printf("\nError al capturar argumento (numero negativo)."); printf("\nNo se puede seguir ejecutando el programa"); exit(0); } printf("\n* Reservando memoria para generar %d datos..",numDatos); TCodific *arr = NULL; arr = (TCodific *) malloc(numDatos * sizeof(TCodific)); if(arr == NULL) { printf("\nError de reserva memoria"); printf("\nNo se puede seguir ejecutando el programa"); exit(0); } long i = 0; /* creando el archivo de salida de datos */ FILE *f = fopen("pedrosilva.dtd","w+"); if(f == NULL) { printf("\nError de apertura de archivo"); printf("\nNo se puede seguir ejecutando el programa"); exit(0); } printf("\n\n* Creando el archivo pedrosilva.dtd en donde se mostraran"); printf("\n los %d datos generados aleatoriamente, en forma ordenada..",numDatos); fprintf(f,"\tARCHIVO DE SALIDA de datos\n"); fprintf(f,"\t--------------------------\n"); fprintf(f,"\n\t** Se generaron %d datos\n",numDatos); /* inicia semilla aleatoria */ srand((unsigned)time( NULL )); printf("\n\n* Generando datos aleatoriamente.."); for(; i < numDatos; i++) generarCodific(&arr[i]); clock_t inicio,fin; double tiempo; printf("\n\n* Ordenando datos con metodo qsort.."); inicio = clock(); qsort((void *) arr,(size_t) numDatos,sizeof(TCodific),fcomp); fin = clock(); tiempo = (double) (fin - inicio) / CLOCKS_PER_SEC; fprintf(f,"\n\tTiempo QSort : %.5lf segundos\n",tiempo); printf("\n\n\tTiempo QSort : %.5lf segundos\n",tiempo); /* escribe en el archivo pedrosilva.dtd los datos ordenados */ printf("\n\n* Escribiendo los datos ordenados en archivo pedrosilva.dtd.."); fprintf(f,"\n\n\t** Datos ordenados **\n"); fprintf(f,"\t ---------------\n"); for(i = 0; i < numDatos; i++) { fprintf(f,"\n\t%d)\t\t",i+1); fprintf(f,"%s\t%d\t%.2lf",arr[i].str, arr[i].numCod,arr[i].tMax); } free(arr); /* libera memoria */ fclose(f); printf("\n\nFin del programa."); getchar(); return 0; } /*************************************** implementacion de funciones ***************************************/ int esVocal(char c) { for(int i = 0; i < 5; i++) if(vocal[i] == c) return 1; return 0; } char generarConsonante() { int c = 97 + (rand() % 26); while(esVocal(c)) { c = 97 + (rand() % 26); } return c; } void generarStr(TCodific *a) { int i = 0; int inicioVocal = rand() % 2; for( ; i < MAX_STR - 1 ; i++) { if(inicioVocal) { if(i % 2 == 0) { a->str[i] = vocal[rand() % 5]; continue; } a->str[i] = generarConsonante(); continue; } if(i % 2 != 0) { a->str[i] = vocal[rand() % 5]; continue; } a->str[i] = generarConsonante(); } a->str[MAX_STR - 1] = '\0'; } void generarCodific(TCodific *a) { a->numCod = rand() % 30000; a->tMax = (double)(rand() % 400) / 100.0; generarStr(a); } int fcomp(const void *a, const void *b) { return strcmp( ((TCodific *) a)->str , ((TCodific *) b)->str); }